﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 面向对象03
{
    class Program
    {
        static void Main(string[] args)
        {
            People xiaoming = new People();
            xiaoming.ID = -1001;
            Console.WriteLine(xiaoming.ID);

            xiaoming.Age = -10;
            Console.WriteLine(xiaoming.Age);

            // 面向对象有3大基本特性：封装、继承、多态
        }
    }

    class People
    {
        // 字段，是真正占内存空间的，只能在类的内部使用
        private int id;
        // 属性，是字段的扩展，源于字段，并不占实际的内存，可以被其他类访问，属性是外部使用的
        public int ID
        {
            get
            {// 取值的时候对数据范围做限定
                if (this.id <= 0)
                {
                    Console.WriteLine("ID是小于0的，是不是当初你写错了，我帮你把id初始化为了100");
                    return 100;
                }
                return this.id;
            }
            set
            {// 赋值
                this.id = value;
            }
        }
        // 当属性同时具有get和set访问器的时候，才能够使用访问器修饰符，而且只允许对其中的一个访问器使用修饰符
        private int age;
        public int Age
        {
            get { return age; }
            set
            {// 在赋值的时候做限定
                if (value < 0)
                {
                    Console.WriteLine("年龄不能小于0，初始化年龄为0");
                    this.age = 0;
                }
                else
                {
                    this.age = value;
                }
            }
        }

        // 属性的简写
        public string Name { get; set; }
        //private string name;
        //public string Name
        //{
        //    get { return this.name; }
        //    set { this.name = value; }
        //}

        // 只读属性
        public bool Sex { get; }
    }
}
